perm filename IMPSER.LST[IP,NET] blob sn#702331 filedate 1983-03-11 generic text, type T, neo UTF8
  1) IMPSER.MA1[IP,NET] and 2) IMPSER.MAC[IP,NET]	3-11-83 12:39	pages 9,9

**** File 1) IMPSER.MA1[IP,NET]/9P/1L
1)	SUBTTL INPUT INTERRUPT SERVICE ;⊗
1)	COMMENT \
**** File 2) IMPSER.MAC[IP,NET]/9P/1L
2)	SUBTTL INPUT INTERRUPT SERVICE
2)	COMMENT \
***************


**** File 1) IMPSER.MA1[IP,NET]/12P/23L
1)		HRLI	T1,MIMBS2##	;MAKE IOWD POINTER TO REMAINING SPACE
1)		AOJA	T1,CPOPJ
**** File 2) IMPSER.MAC[IP,NET]/12P/23L
2)		HRLI	T1,-ImpBfs##+NBHLen+1	;MAKE IOWD POINTER TO REMAINING SPACE
2)		AOJA	T1,CPOPJ
***************


**** File 1) IMPSER.MA1[IP,NET]/13P/26L
1)		HRLI	T1,MIMBS1##	;MAKE AN IOWD
1)		POPJ	P,
**** File 2) IMPSER.MAC[IP,NET]/13P/26L
2)		HRLI	T1,-ImpBfs##+NBHLen	;MAKE AN IOWD
2)		POPJ	P,
***************


**** File 1) IMPSER.MA1[IP,NET]/28P/1L
1)	SUBTTL OUTPUT INTERRUPT SERVICE ;⊗
1)	REPEAT 0,<
**** File 2) IMPSER.MAC[IP,NET]/28P/1L
2)	SUBTTL OUTPUT INTERRUPT SERVICE
2)	REPEAT 0,<
***************


**** File 1) IMPSER.MA1[IP,NET]/29P/1L
1)		MESSAGE QUEUES: ;⊗
1)		THE NCP HOST QUEUES ARE HANDLED ENTIRELY WITHIN THE NETWORK
**** File 2) IMPSER.MAC[IP,NET]/29P/1L
2)		MESSAGE QUEUES:
2)		THE NCP HOST QUEUES ARE HANDLED ENTIRELY WITHIN THE NETWORK
***************


**** File 1) IMPSER.MA1[IP,NET]/30P/22L
1)		 stopcd	SonPPJ##,DEBUG,ZER	;++ zero entry returned.
1)	>
**** File 2) IMPSER.MAC[IP,NET]/30P/22L
2)		 stopcd	CPOPJ,DEBUG,ZER		;++ zero entry returned.
2)	>
***************


**** File 1) IMPSER.MA1[IP,NET]/35P/23L
1)		  CAIL	T2,MAXMES	; or too big for an IMP message?
1)					; (note: we are ignoring options here)
**** File 2) IMPSER.MAC[IP,NET]/35P/23L
2)	;[fudge]  CAIL	T2,MAXMES	; or too big for an IMP message?
2)		  cail	t2,MaxMes-5	;[fudge] cover for off by one (or more)
2)					;[fudge]  arithmetic somewhere.
2)					; (note: we are ignoring options here)
***************


**** File 1) IMPSER.MA1[IP,NET]/35P/27L
1)		sosle	SndWnd(f)	; window size is one less.  room here?
1)		 JSP	P4,(P4)		; yes.  STUFF THE DATA
**** File 2) IMPSER.MAC[IP,NET]/35P/29L
2)		sosl	SndWnd(f)	; window size is one less.  room here?
2)		 JSP	P4,(P4)		; yes.  STUFF THE DATA
***************


**** File 1) IMPSER.MA1[IP,NET]/41P/1L
1)	;SUBROUTINE TO LINK AN ENTIRE MESSAGE FOR TRANSMISSION. ;⊗ OUTBYT OutBy0
1)	IFWAITS<ENTRY OUTBYT>
**** File 2) IMPSER.MAC[IP,NET]/41P/1L
2)	; subroutine to decide if there's enough buffer space to send a message
2)	OutPre::
2)		pushj	p,save2##		; get two Ps (P2 for the IDIVI)
2)		move	p1,OBfByt(f)		; get the byte count
2)		; add the number of bytes we should see in the leaders.
2)		addi	p1,<HTISiz/↑d8>+<IPLen##*4>+<TCPLen##*4>+NBfB36-1
2)		idivi	p1,NBfB36		; how many buffer's do we need?
2)		camg	p1,BufNum##		; do we have that many?
2)		  pjrst	cpopj1##		; yes!
2)		popj	p,			; no.
2)	;SUBROUTINE TO LINK AN ENTIRE MESSAGE FOR TRANSMISSION.
2)	; this routine assumes that enough buffers are available.  call
2)	;  OutPre to check with SCNOFFed before calling this routine.
2)	IFWAITS<ENTRY OUTBYT>
***************


**** File 1) IMPSER.MA1[IP,NET]/42P/10L
1)	;	routine returns non-skip will DDB as it was on call (i.e., no
1)	;	buffers are deleted, no counts are changed).  skip return properly
1)	;	deletes all buffers, etc.
1)	;
**** File 2) IMPSER.MAC[IP,NET]/42P/10L
2)	;	routine STOPCDs.
2)	;
2)	; Important: enough buffers MUST be available for this routine before it
2)	;	is called.  if it tries to get a buffer and can't, it STOPCDs.
2)	;	use OutPre to check.
2)	;
***************


**** File 1) IMPSER.MA1[IP,NET]/42P/18L
1)	;		ScnOff
1)	;		pushj	p,ImpMak
1)	;		  <insufficient buffer space>
1)	;		<message is in transmission queue (and retransmission queue
1)	;				if appropriate>
1)	;
**** File 2) IMPSER.MAC[IP,NET]/42P/20L
2)	;		move	t1,<1822 protocol number of calling protocol>
2)	;		ScnOff
2)	;		<insure that enough buffers are available by calling
2)	;			OutPre>
2)	;		pushj	p,ImpMak
2)	;		<always returns here>
2)	;
***************


**** File 1) IMPSER.MA1[IP,NET]/42P/27L
1)	;
**** File 2) IMPSER.MAC[IP,NET]/42P/30L
2)	;	T1 - calling protocol number for 1822.
2)	;
***************


**** File 1) IMPSER.MA1[IP,NET]/42P/42L
1)	;	returns non-skip if there is not enough buffer space to accomplish
1)	;	this, else skip returns.
1)	;
**** File 2) IMPSER.MAC[IP,NET]/42P/46L
2)	;	always returns non-skip, but may STOPCD if there are not enough
2)	;	buffers for the conversion to 36 bits or if not enough free core
2)	;	is available for a BIB.
2)	;
***************


**** File 1) IMPSER.MA1[IP,NET]/42P/58L
1)		  popj	p,			; error return, no buffer.  let him
1)						;  try again later.
1)		move	p1,ObfByt(F)		; get byte COUNT
**** File 2) IMPSER.MAC[IP,NET]/42P/63L
2)		 stopcd	CPOPJ##,DEBUG,GBM,	;++ guarenteed buffer missing.
2)		move	p1,ObfByt(F)		; get byte COUNT
***************


**** File 1) IMPSER.MA1[IP,NET]/42P/89L
1)		move	p1,OBfFst(f)		; get the real first
1)		push	p,f			; save our DDB
**** File 2) IMPSER.MAC[IP,NET]/42P/93L
2)		setz	p1,			; clear the first buffer pointer...
2)		exch	p1,OBfFst(f)		; ...and get the real first.
2)		push	p,f			; save our DDB
***************


**** File 1) IMPSER.MA1[IP,NET]/42P/105L
1)	ImpMa3:	load.	p1,NBHNxt,(p1)		; get next buffer
1)		jrst	ImpMa1			; and deal with the new one
**** File 2) IMPSER.MAC[IP,NET]/42P/110L
2)	ImpMa3:	move	t1,p1			; get a copy
2)		load.	p1,NBHNxt,(p1)		; get next buffer
2)		pushj	p,BufRel##		; free the spent buffer.
2)		jrst	ImpMa1			; and deal with the new one
***************


**** File 1) IMPSER.MA1[IP,NET]/42P/128L
1)		move	t1,OBfFst(f)		; get a pointer to the first buffer
1)		pushj	p,RelBuf##		; release the whole chain now
1)						;  that we're done with it.
1)		SETZM	OBFFST(F)		; remember there's nothing more here
1)		SETZM	OBFLST(F)		;  now that we successfully got it
**** File 2) IMPSER.MAC[IP,NET]/42P/135L
2)	MakOut:	SETZM	OBFFST(F)		; remember there's nothing more here
2)		SETZM	OBFLST(F)		;  now that we successfully got it
***************


**** File 1) IMPSER.MA1[IP,NET]/42P/135L
1)		pjrst	cpopj1##		; all good. return happy
1)	MakErr:	pop	p,f			; remember to get back our DDB
1)	MakEr1:	aos	ImpIME##		; count ImpMak error
1)		move	t1,OBfFst+IMkDDB	; get the first in the chain we
1)						;  were trying to build.
1)		pjrst	RelBuf##		; flush it and take bad return
1)	; subroutine to queue a TCP message for output from interrupt level. ;⊗ SndMsg
1)	; call with:
**** File 2) IMPSER.MAC[IP,NET]/42P/139L
2)		popj	p,			; and return.
2)	MakErr:	pop	p,f			; remember to get back our DDB
2)		stopcd	.+1,DEBUG,MGB,		; missing guarenteed buffer
2)		move	t1,p1			; point at remains of stream we
2)						; were translating.
2)		pushj	p,RelBuf##		; flush it
2)		jrst	MakEr2			; and flush what we've created.
2)	MakEr1:	stopcd	.+1,DEBUG,CGB,		;++ can't get BIB for ImpMak
2)	MakEr2:	move	t1,OBfFst+IMkDDB	; get the first in the chain we
2)						;  were trying to build.
2)		pushj	p,RelBuf##		; flush it.
2)		jrst	MakOut			; make sure to clear everything
2)	; subroutine to queue a TCP message for output from interrupt level.
2)	; call with:
***************


**** File 1) IMPSER.MA1[IP,NET]/43P/6L
1)		  pjrst	cpopj1##		; yes.  it will send the things we
1)						;  want sent piggy-back.  good return.
1)		setzm	ObfThs(f)		; no current buffer
**** File 2) IMPSER.MAC[IP,NET]/43P/6L
2)		  pjrst	cpopj##			; yes.  it will send the things we
2)						;  want sent piggy-back.
2)		pushj	p,OutPre		; are there enough buffers to send it?
2)		  popj	p,			; no.  take error return.
2)		setzm	ObfThs(f)		; no current buffer
***************


**** File 1) IMPSER.MA1[IP,NET]/43P/14L
1)		  sos	-1(p)			; preset for bad return
1)		pop	p,p3			; get back P3
**** File 2) IMPSER.MAC[IP,NET]/43P/16L
2)		pop	p,p3			; get back P3
***************


**** File 1) IMPSER.MA1[IP,NET]/48P/33L
1)		PUSHJ	P,IMPION##	;AND TURN INPUT BACK ON
1)		jrst	Q4Nop0		; queue up 4 no-ops, interrupts already off.
**** File 2) IMPSER.MAC[IP,NET]/48P/33L
2)		skipn	IBfHlt		; waiting for a buffer to appear?
2)		  PUSHJ	P,IMPION##	; no.  TURN INPUT BACK ON
2)		jrst	Q4Nop0		; queue up 4 no-ops, interrupts already off.
***************


**** File 1) IMPSER.MA1[IP,NET]/51P/45L
1)		MITYN##	,,  ITYTAB##	;PSEUDO TELETYPE 'ITY' LINKAGE TABLE
1)		IMPM36##,,  IMPBFT##	;BUFFER ALLOCATION TABLE
1)		ZERTBN==.-ZERTAB
**** File 2) IMPSER.MAC[IP,NET]/51P/45L
2)		-ITYN##	,,  ITYTAB##	;PSEUDO TELETYPE 'ITY' LINKAGE TABLE
2)		-IMPB36##,,  IMPBFT##	;BUFFER ALLOCATION TABLE
2)		TCPDCn##,,  TCPDat##	; TCP data area.
2)		ZERTBN==.-ZERTAB
***************


**** File 1) IMPSER.MA1[IP,NET]/52P/5L
1)	OCLSE:	PUSHJ	P,OUT##		;SEND LAST BUFFER(S)
1)		MOVSI	S,IO	;SET FLAG
**** File 2) IMPSER.MAC[IP,NET]/52P/5L
2)	OCLSE:	pushj	p,TCPCls##		; tell TCP about the close.
2)						;  close does a TCP push.
2)		PUSHJ	P,OUT##		;SEND LAST BUFFER(S)
2)		MOVSI	S,IO	;SET FLAG
***************


**** File 1) IMPSER.MA1[IP,NET]/57P/21L
1)	OUT05:	ScnOff
1)		PUSHJ	P,OUTBYT	; send it out
1)		  jrst	[		; not enough room.
1)			 ScnOn			; interrupts back on
**** File 2) IMPSER.MAC[IP,NET]/57P/21L
2)	OUT05:	skipg	DevCtr(f)		; is this the last byte in the
2)						;  buffer?
2)		  pushj	p,TCPPsh##		; yes.  let TCP do push handling.
2)		ScnOff
2)		pushj	p,OutPre		; predict it we will have enough
2)						;  buffers for this message.
2)		  jrst	[			; not enough room.
2)			 ScnOn			; interrupts back on
***************


**** File 1) IMPSER.MA1[IP,NET]/57P/27L
1)		ScnOn
**** File 2) IMPSER.MAC[IP,NET]/57P/31L
2)		PUSHJ	P,OUTBYT	; send it out
2)		ScnOn
***************


**** File 1) IMPSER.MA1[IP,NET]/75P/11L
1)		pushj	p,TCPTCk##		; enough window for this?
1)		  jrst	TTYRn1			; no.  try to send what's there.
1)		SETZM	OTTYC(F)	;CLEAR SAVED CHARACTER
**** File 2) IMPSER.MAC[IP,NET]/75P/11L
2)		SETZM	OTTYC(F)	;CLEAR SAVED CHARACTER
***************


**** File 1) IMPSER.MA1[IP,NET]/76P/29L
1)	ImpTy1:	PUSHJ	P,OTBYTE	;TEST AND BUFFER IT
1)		  JRST	IMPTY5		;TOO MUCH (LH OF T2 TELLS WHY)
**** File 2) IMPSER.MAC[IP,NET]/76P/29L
2)	ImpTy1:	pushj	p,TCPTCk##	; any window, and are we in a correct state?
2)		  jrst	ImpTy5		; no.  try to send what's there.
2)		PUSHJ	P,OTBYTE	;TEST AND BUFFER IT
2)		  JRST	IMPTY5		;TOO MUCH (LH OF T2 TELLS WHY)
***************


**** File 1) IMPSER.MA1[IP,NET]/76P/45L
1)		JRST	XMTIMP##	;BACK FOR NEXT SCANNER INTERRUPT
1)	;HERE IF NO IMP CONNECTED TO THE LINE.
**** File 2) IMPSER.MAC[IP,NET]/76P/47L
2)		JRST	XMTIn1##	;BACK FOR NEXT SCANNER INTERRUPT, U set up.
2)	;HERE IF NO IMP CONNECTED TO THE LINE.
***************


**** File 1) IMPSER.MA1[IP,NET]/76P/50L
1)		JRST	XMTIMP##	;AND THROW OUT THE CHAR
1)	;HERE IF BIT OR BUFFER SHORTAGE
1)	IMPTY5:	ANDI	T1,377		;ENSURE JUST 1 CHAR HERE
1)		HRL	T1,T2		;SET FLAG WITH CHARACTER
1)		TRO	T1,1B18		;CHARACTER NEVER NULL
**** File 2) IMPSER.MAC[IP,NET]/76P/52L
2)		JRST	XMTIn1##	;AND THROW OUT THE CHAR, get next.
2)	;HERE IF BIT OR BUFFER SHORTAGE
2)	IMPTY5:	ANDI	T1,377		;ENSURE JUST 1 CHAR HERE
2)		HRL	T1,T2		;SET FLAG WITH CHARACTER (flag unused)
2)		TRO	T1,1B18		;CHARACTER NEVER NULL
***************


**** File 1) IMPSER.MA1[IP,NET]/76P/70L
1)		push	p,f			; save DDB
1)		LDB	f,LDPLNO##		;GET LINE NUMBER
1)		move	F,ITYOFS##(f)		; get DDB of imp
1)		pushj	p,TCPTCk##		; enough window?
1)		  pjrst	fpopj##			; no.  don't try to send
1)		pop	p,f			; restore old F so we can save
1)						;  it again later.
1)		SKIPGE	LDBDCH##(U)	;LINE IDLE?
**** File 2) IMPSER.MAC[IP,NET]/76P/72L
2)		SKIPGE	LDBDCH##(U)	;LINE IDLE?
***************


**** File 1) IMPSER.MA1[IP,NET]/77P/34L
1)	ifn FtChck,<	; take check sum
**** File 2) IMPSER.MAC[IP,NET]/77P/34L
2)		pushj	p,OutPre		; are there enough buffers available
2)						;  to send this message?
2)		  pjrst	sonppj##		; no.  don't send it.
2)						; note: user must type something for
2)						;  this to revive.  should be fixed.
2)	ifn FtChck,<	; take check sum
***************


**** File 1) IMPSER.MA1[IP,NET]/77P/40L
1)		  aos	ImpOOB##		; count out of buffers error
1)	ifn FtChck,<	; take check sum
**** File 2) IMPSER.MAC[IP,NET]/77P/45L
2)	ifn FtChck,<	; take check sum
***************


**** File 1) IMPSER.MA1[IP,NET]/87P/13L
1)		PUSHJ	P,SETNEC	;OKAY, STOP ECHO (AND MAYBE PASS DOWN)
1)		HLRZ	F,(P)		;GET IMPDDB BACK
**** File 2) IMPSER.MAC[IP,NET]/87P/13L
2)		PUSHJ	P,SETNEC##	;OKAY, STOP ECHO (AND MAYBE PASS DOWN)
2)		HLRZ	F,(P)		;GET IMPDDB BACK
***************


**** File 1) IMPSER.MA1[IP,NET]/87P/21L
1)		PUSHJ	P,SETECH	;BACK TO ECHO MODE
1)		HLRZ	F,(P)		;BACK TO IMP
**** File 2) IMPSER.MAC[IP,NET]/87P/21L
2)		PUSHJ	P,SETECH##	;BACK TO ECHO MODE
2)		HLRZ	F,(P)		;BACK TO IMP
***************


**** File 1) IMPSER.MA1[IP,NET]/95P/11L
1)		MOVSI	U,MITYN##	;FIND UNUSED ITY
1)	ITYGE1:	SKIPE	ITYTAB(U)	;THIS ONE?
**** File 2) IMPSER.MAC[IP,NET]/95P/11L
2)		MOVSI	U,-ITYN##	;FIND UNUSED ITY
2)	ITYGE1:	SKIPE	ITYTAB(U)	;THIS ONE?
***************


**** File 1) IMPSER.MA1[IP,NET]/96P/17L
1)		PUSHJ	P,TTYOFF##	;SIGNAL DISCONNECT
1)	ITYRE2:	POP	P,U		;RESTORE U
**** File 2) IMPSER.MAC[IP,NET]/96P/17L
2)		PUSHJ	P,DscClr##	;SIGNAL DISCONNECT and clear down LDB
2)	ITYRE2:	POP	P,U		;RESTORE U
***************


**** File 1) IMPSER.MA1[IP,NET]/97P/1L
1)	;HOST TABLE: ;⊗
1)	;ENTRY FORMAT:		;[96bit]
**** File 2) IMPSER.MAC[IP,NET]/97P/1L
2)	;HOST TABLE:
2)	;ENTRY FORMAT:		;[96bit]
***************


**** File 1) IMPSER.MA1[IP,NET]/110P/5L
1)		move	p1,RetrnQ(f)		; get our retranmission queue
1)	FixLup:	jumpe	p1,cpopj##		; no more in retranmission queue
1)		load.	p2,BIBMes,(p1)		; point at the first buffer in
**** File 2) IMPSER.MAC[IP,NET]/110P/5L
2)		scnoff				; don't allow distractions
2)		move	p1,RetrnQ(f)		; get our retranmission queue
2)	FixLup:	jumpe	p1,sonppj##		; no more in retranmission queue
2)		load.	p2,BIBMes,(p1)		; point at the first buffer in
***************


**** File 1) IMPSER.MA1[IP,NET]/112P/44L
1)	IMkDDB=.-ImpTop			; hypothetic start of this DDB
1)		block	ImpBot-ImpTop+1	; allocate words needed
1)	;TEMPORARY STORAGE
**** File 2) IMPSER.MAC[IP,NET]/112P/44L
2)	IMkDDB=.-OBfTop			; hypothetic start of this DDB
2)		block	OBfBot-OBfTop+1	; allocate words needed
2)	;TEMPORARY STORAGE
***************